package com.cskaoyan.javase._0encapsulate._1notice;

/**
 * 使用private私有化成员变量，并提供方法给外界访问时，需要注意：
 *      1.成员变量的访问权限应该尽量收紧，尽量私有化，当然有必要时也可以给外界权限直接访问。
 *          强调:
 *              在实际开发中,建议对于成员变量,如果不清楚外界是否要访问它
 *              那先给它私有化掉
 *              实际上,在多数情况下,无脑私有化类中的成员变量是一个不会出错的选择
 *              然后这个成员变量如果对外有访问需求,那再提供Getter/Setter方法即可.
 *
 *              当然,如果确信在外部真的需要频繁访问一个成员变量,那还是不要私有化它更好
 *
 *      2.Getter/Setter方法语法是很固定的,所以不要手写它,而是采用快捷键自动生成
 *          Alt + insert
 *
 *     3. 对于boolean类型的成员变量来说，Getter方法的名字比较特殊，采用isXxx（Xxx是变量名）的形式。
 *
 *     4.静态成员变量，如果也需要Getter/Setter方法，需要注意其Getter/Setter方法也要是静态的。
 *          （当然，静态变量写Getter/Setter方法是很少见的）
 *
 *
 * @since 15:39
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {

    }
}

class Teacher {
    private int age;
    private String name;
    private double salary;
    /*
        性别这个属性
        建议使用String gender
        不建议使用布尔类型boolean isMale

        这是因为布尔类型成员变量的Getter有特殊的格式,它不叫"getXxx"
        而是叫"isXxx"
        当布尔类型成员变量就叫"isXxxx"时,就会导致该成员变量的Getter方法名和成员变量名一致
        就会导致误解发生.
        扩展:
            实际开发中,Getter/Setter方法不是给程序员调用的,而是给框架自动调用的
            这样框架通过方法名识别成员变量的名字,就会出现误解
            就会导致程序报错终止.
     */
    // private boolean isMale;

    /*public boolean isMale() {
        return isMale;
    }

    public void setMale(boolean male) {
        isMale = male;
    }*/

    private boolean flag;

    private static int num;

    public static int getNum() {
        return num;
    }

    public static void setNum(int num) {
        Teacher.num = num;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    // alt + insert
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}
